#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <pwd.h>
#include <string.h>

#define BUFSIZE 200
#define NORMAL 0
#define BACKLOG 1           //taille de la file d'attente initialisée par listen
#define MAXHOSTNAME 32
//#define MAXREQ 3            //Nombre de requêtes traitées par ce programme, il s'arrête dès que la limite est atteinte

//Procédure du traitemant de la requête
void quiest(int sock){

  struct passwd *p;
  char buf[BUFSIZE];
  int i;

  if((i = recv(sock,buf,BUFSIZE,NORMAL)) <= 0) //réception de la demande
    return;
  if ((p = getpwnam(buf)) == NULL) //recherche dans le fichier
    strcpy(buf,"Utilisateur inconnu sur le serveur\n");
  else   //réponse
    sprintf(buf,"%s :%s\n",p->pw_name,p->pw_gecos);

  send(sock,buf,strlen(buf),NORMAL);
}

void main(){

  int s,t;                  //descripteur de socket
  int i;//,count_req;
  struct sockaddr_in sa;    //structure adresse internet
  struct sockaddr_in isa;
  //  struct hostent *hp;       //structure service de nom
  //struct servent *sp;       //structure service Internet
  char localhost[MAXHOSTNAME+1];


  if((s = socket(AF_INET,SOCK_STREAM,0)) < 0){     //allocation d'un descripteur de socket
    perror("ERROR socket");
    exit(1);
  }
	bzero(&sa,sizeof(sa));
	sa.sin_family = AF_INET;
	sa.sin_port = htons(7000);
	sa.sin_addr.s_addr = htonl(INADDR_ANY);

  if(bind(s,(const struct sockaddr *)&sa,sizeof(sa)) < 0){ //lien socket avec adresse IP et port
    fprintf(stderr,"ERROR bind\n");
    exit(1);
  }

  listen(s,BACKLOG); //attente de demande de connexion

  fprintf(stdout,"Service %d sur %s en attente\n",sa.sin_port,localhost);
  fprintf(stdout, "type d'adresse : %d\n",sa.sin_family);

  for( ; ; ){
    t=accept(s,(struct sockaddr * __restrict__)&isa,&i);

    //  fprintf(stdout,"Requête %d\n",count_req);

    quiest(t);    //traitement de la requête

    close(t);    //fermeture de la socket réservée au traitement de cette requête
  }

  close(s);

  fprintf(stdout,"Fin de service pour %s\n",localhost);

  exit(0);
}


